package org.lestr.secuel.m3ds.objets3D;

import java.util.Collection;
import java.util.Iterator;

import org.lestr.secuel.m3ds.Variable;
import org.lestr.secuel.m3ds.animations.AnimationObjets3D;

public interface IObjet3d {


    /* ----------------------------
     * Général
     * ---------------------------- */
    void définirNom(String nom);


    String obtenirNom();


    Collection<Variable> obtenirVariables();


    Collection<IEcouteur> obtenirEcouteurs();


    /* ----------------------------
     * Forme
     * ---------------------------- */
    void ajouterTriangles(Collection<ITriangle> triangles);


    void ajouterTriangle(ITriangle triangle);


    void retirerTriangle(ITriangle triangle);


    Iterable<ITriangle> obtenirTriangles();


    /* ----------------------------
     * Collisions
     * ---------------------------- */
    Collection<IEcouteurCollisions> obtenirEcouteursCollisions();


    Iterator<IObjet3d> obtenirCollisions();


    boolean estEnCollision(IObjet3d objet);


    /* ----------------------------
     * Position
     * ---------------------------- */
    IPositionObjet3d obtenirPosition();


    IOrientationObjet3d obtenirOrientation();


    IDimensionObjet3d obtenirDimension();



    /* ----------------------------
     * Apparence
     * ---------------------------- */
    IApparence obtenirApparence();


    void définirTransparence(int taux);


    int obtenirTransparence();


    public void définirRéflexion(int taux);


    int obtenirRéflexion();


    /* ----------------------------
     * Animations
     * ---------------------------- */
    void ajoutAnimation(AnimationObjets3D animation);


    void retraitAnimation(AnimationObjets3D animation);


    Collection<AnimationObjets3D> getAnimations();


    /* ----------------------------
     * Animations propres
     * ---------------------------- */
    void lire(int début,
              int fin);


    void arrêter();


    void setCléCourante(int clé);


    int getNbClés();


    void setEnBoucle(boolean enBoucle);


    boolean isEnBoucle(boolean enBoucle);


    public static interface IEcouteur {


        /** Le nom a été changé */
        void nomChangé(IObjet3d objet,
                       String ancienNom);


        /** Un triangle a été ajouté à l'objet 3D */
        void triangleAjouté(IObjet3d objet,
                            ITriangle triangle);


        /** Un triangle a été retiré à l'objet 3D */
        void triangleRetiré(IObjet3d objet,
                            ITriangle triangle);


        /** La transparence de l'objet 3D a changé */
        void transparenceChangée(IObjet3d objet,
                                 int ancienneTransparence);


        /** La réflexion de l'objet 3D a changé */
        void réflexionChangée(IObjet3d objet,
                              int ancienneRéfexion);


        /** Une animation a été ajoutée à l'objet 3D */
        void animationAjoutée(IObjet3d objet,
                              AnimationObjets3D animation);


        /** Une animation a été retirée à l'objet 3D */
        void animationRetirée(IObjet3d objet,
                              AnimationObjets3D animation);


        /** La lecture d'une animation propre a démarré */
        void lu(IObjet3d objet);


        /** La lecture d'une animation propre a arrêté */
        void arrêté(IObjet3d objet);


        public static class Adaptateur implements IEcouteur {


            @Override
            public void nomChangé(IObjet3d objet,
                                  String ancienNom) {
            }// FIN Méthode nomChangé


            @Override
            public void triangleAjouté(IObjet3d objet,
                                       ITriangle triangle) {
            }// FIN Méthode triangleAjouté


            @Override
            public void triangleRetiré(IObjet3d objet,
                                       ITriangle triangle) {
            }// FIN Méthode triangleRetiré


            @Override
            public void transparenceChangée(IObjet3d objet,
                                            int ancienneTransparence) {
            }// FIN Méthode transparenceChangée


            @Override
            public void réflexionChangée(IObjet3d objet,
                                         int ancienneRéfexion) {
            }// FIN Méthode réflexionChangée


            @Override
            public void animationAjoutée(IObjet3d objet,
                                         AnimationObjets3D animation) {
            }// FIN Méthode animationAjoutée


            @Override
            public void animationRetirée(IObjet3d objet,
                                         AnimationObjets3D animation) {
            }// FIN Méthode animationRetirée


            @Override
            public void lu(IObjet3d objet) {
            }// FIN Méthode lu


            @Override
            public void arrêté(IObjet3d objet) {
            }// FIN Méthode arrêté


        }// FIN classe Adaptateur


    }// FIN Interface IEcouteur


    public static interface IEcouteurCollisions {


        /** Signal un début de collision entre deux objets */
        void débutCollision(IObjet3d origine,
                            IObjet3d étranger);


        /** Signal une fin de collision entre deux objets */
        void finCollision(IObjet3d origine,
                          IObjet3d étranger);


        public class Adapateur implements IEcouteurCollisions {


            @Override
            public void débutCollision(IObjet3d origine,
                                       IObjet3d étranger) {
            }// FIN Méthode débutCollision


            @Override
            public void finCollision(IObjet3d origine,
                                     IObjet3d étranger) {
            }// FIN Méthode finCollision


        }// FIN Classe Adapatateur


    }// FIN Interface IEcouteurCollisions


}// FIN Interface
